package sucre 

import ve.org.src.constantes.LoginConstantes
import ve.org.src.constantes.EventoConstantes
import sucre.LoginService
import ve.org.src.sesiones.CacheSeguridad
import ve.org.src.util.DirectivasUtils

class UsuarioController {

    def loginService
    def beforeInterceptor = [action:this.&auth]
    def auth = {
        def result =loginService.validarAcceso(
            session["seguridad_usuario"],
            session["seguridad_funcionesHabilitadas"],
            controllerName,actionName,request.getRemoteAddr().toString())
        if(!result) {
            redirect(controller:"login",action:"auth",params:['acceso':false])
            return false
        }
    }
    def index = {}

    // the delete, save and update actions only accept POST requests
    static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def parametersService
    def auditoriaService
    
    def list = {
        params.max=parametersService.getInt("paginacion.maxRegPagina")
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        def query={
            if(params.searchField){
                ilike('nombreCompleto','%'+params.searchField+'%')
            }
        }
        def usuarioList=Usuario.createCriteria().list(params,query)
        [ usuarioInstanceList:usuarioList,
            usuarioInstanceTotal: usuarioList.getTotalCount()]
    }
    def delete = {
        def listaErrores=[]
        def usuarioInstance = Usuario.get(params.id)
        Usuario.withTransaction{ status ->
            Usuario userAuditoria=CacheSeguridad.
                getUsuario(session['seguridad_usuario'])
            try{
                if(usuarioInstance) {
                    def passwords=Password.createCriteria().list{
                        eq('usuario',usuarioInstance)
                    }
                    passwords.each{
                        it.delete(flush:true)
                    }
                    //def listaAuditoriaAccion = AuditoriaAccion.createCriteria().list{
                     //   eq('usuario',usuarioInstance)
                   // }

//                    listaAuditoriaAccion.each{
//                        it.delete(flush:true)
//                    }
                    usuarioInstance.delete(flush:true)
//                    auditoriaService.registrarAuditoriaEvento(
//                        userAuditoria,EventoConstantes.USUARIO_ELIMINADO,
//                        request.getRemoteAddr().toString(),'USUARIO #'
//                        + usuarioInstance.id)
                    flash.message=message(code:'def.usuario.eliminado',
                        args:[usuarioInstance])
                }
            }catch(Exception e){
                println e
                listaErrores.add(message(code:'def.usuario.error.eliminando'))
                status.setRollbackOnly()
            }
            render(view:'create',model:[usuarioInstance:new Usuario(),upd:'si',
                    estadosUsuario:estadosUsuario(),listaErrores:listaErrores])
        }
    }
    def estadosUsuario(){
        def listaEstados=[]
        LoginConstantes.ESTADOS_USUARIO.each{
            listaEstados.add([id:it,nombre:message(code:'usuario.estado.'+it)])
        }
        return listaEstados
    } 
    def create = {
        def instance = new Usuario()
        instance.properties = params
        if(params.eOc=='edit'){
            instance=Usuario.findById(params.id)
        }else{  
            flash.message=''
            params.eOc='create'
        }
        return [usuarioInstance:instance,eOc:params.eOc,
            estadosUsuario:estadosUsuario()]
    }
    


    def save = {
        def listaErrores=[]
        def sendingEmail=0
        Usuario userAuditoria=CacheSeguridad.
            getUsuario(session['seguridad_usuario'])        
        def usuarioInstance = new Usuario(params)
        if(params.eOc=='edit'){
            usuarioInstance=Usuario.get(params.id)
            usuarioInstance.properties=params
        }
        if(params.password){
            usuarioInstance.fechaCaducidad=new Date()
        }
       usuarioInstance.fechaUltimoAcceso=new Date()
            def logserv=new LoginService()
            Usuario.withTransaction{ status ->
                try{
                    if(!usuarioInstance.hasErrors() && usuarioInstance.save()) {
                    
                        if(params.eOc=='create'){
                            //auditoriaService.registrarAuditoriaEvento(userAuditoria,EventoConstantes.USUARIO_CREADO,request.getRemoteAddr().toString(),'USUARIO #'+usuarioInstance.id)
                            flash.message=message(code:'def.usuario.creado',args:[usuarioInstance])
                        }else{
                            //auditoriaService.registrarAuditoriaEvento(userAuditoria,EventoConstantes.USUARIO_MODIFICADO,request.getRemoteAddr().toString(),'USUARIO #'+usuarioInstance.id)
                            flash.message=message(code:'def.usuario.actualizado',args:[usuarioInstance])
                        }
                        if(params.password){

                            if(logserv.nuevoPassword(usuarioInstance,params.password)){
                                //auditoriaService.registrarAuditoriaEvento(userAuditoria,EventoConstantes.NUEVO_PASSWORD_CREADO,request.getRemoteAddr().toString(),'USUARIO #'+usuarioInstance.id)
                                try{
                                    if(params.enviarPassword){
                                        sendingEmail=1
                                        def response=sendMail {
                                            to usuarioInstance.email
                                            subject message('code':'def.usuario.passEnviado.subject')
                                            html message('code':'def.usuario.passEnviado.msg',args:[params.password])
                                        }
                                        //auditoriaService.registrarAuditoriaEvento(userAuditoria,EventoConstantes.PASSWORD_ENVIADO_CORREO,request.getRemoteAddr().toString(),'USUARIO #'+usuarioInstance.id)
                                    }
                                }catch(Exception e){
                                    println e
                                    listaErrores.add(message(code:'def.usuario.error.EnviandoEmail'))
                                    status.setRollbackOnly()
                                }
                            }
                        }
                        if(params.eOc=='create'){
                            params.eOc='edit'
                        }
                    }
                }catch(Exception e){
                    println e
                    listaErrores.add(message(code:'def.usuario.error.Creando'))
                    status.setRollbackOnly()
                }
            }
        render(view:'create',model:[usuarioInstance:usuarioInstance,
                eOc:params.eOc,upd:'si',estadosUsuario:estadosUsuario(),
                sendingEmail:sendingEmail,listaErrores:listaErrores])
    }
    def search={
        redirect(action:list,params:[searchField:params.searchField])
    }
    def generarPassword={
        String password='123456'
        def v1=DirectivaPassword.findByNombre(DirectivasUtils.clave_default)
        if(v1){
            password=v1.valor
        }
        String html='<input type="password" name="password" value="'+password+'" style="width:200px" class="campos" disabled /><span class="help_button" title="Establece la contraseña por defecto">&nbsp;</span>'
        render(html)
    }
}